import pkg from 'sm-crypto';
import CryptoJS from 'crypto-js';
const { sm4 } = pkg;

const masterKey = "ikun";

// 与前端加密key方式相同
const generateTimeKey = (t = new Date()) => { // 动态生成 SM4 密钥
  const hourlyTimestamp = getHourlyTimestamp(t); // 获取当前小时的时间戳
  const hmac = CryptoJS.HmacSHA256(hourlyTimestamp, masterKey); // 使用 HmacSHA256 算法计算 HMAC 值
  const sm4KeyHex = hmac.toString(CryptoJS.enc.Hex).substring(0, 32); // 截取前 16 字节作为 SM4 密钥（128 位）
  return sm4KeyHex;
};

// 返回以小时为单位的时间戳字符串
function getHourlyTimestamp(t = new Date()) {
  const YYYY = t.getUTCFullYear();
  const MM = String(t.getUTCMonth() + 1).padStart(2, "0"); // getUTCMonth() 返回的是从 0 开始的索引
  const DD = String(t.getUTCDate()).padStart(2, "0");
  const HH = String(t.getUTCHours()).padStart(2, "0");
  return `${YYYY}${MM}${DD}${HH}`;
}

export const postcrypto = (req,res) => {
  const data = req.body.crypto
  const iv = data.substring(0, 32); // Iv 占据前32位
  const encrypted = data.substring(32); // 密文占据剩余部分
  const result = sm4.decrypt(encrypted, generateTimeKey(), {mode: 'cbc', iv: iv});
  res.send({ status: 200, data: JSON.parse(result) })
}